package common.utils;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class ReadExcel {

	/**
	 * 读取Excel的内容
	 * 
	 * @param file Excel
	 * @param ignoreRows 读取数据忽略的行数，比喻行头不需要读入 忽略的行数为1
	 * @return 二维数组
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static String[][] getData(File file, int ignoreRows)
			throws FileNotFoundException, IOException {
		List<String[]> result = new ArrayList<String[]>();
		int rowSize = 0;
		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream in = new BufferedInputStream(fis);
		//创建工作表格
		Workbook wb = null;
		String fileName = file.getName();
		String extension = fileName.lastIndexOf(".")==-1?"":fileName.substring(fileName.lastIndexOf(".")+1);
		//得到Excel工作簿对象
		if("xls".equals(extension)){
			wb = new HSSFWorkbook(in); 
		}else if("xlsx".equals(extension)){ 
			wb = new XSSFWorkbook(in); 
		}
		Cell cell = null;
		//wb.getNumberOfSheets()可以获得excel有多少工作表对象（excel左下角的sheet）
		for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
			//得到Excel工作表对象  
			Sheet st = wb.getSheetAt(sheetIndex);
			// 第一行为标题，不取；getLastRowNum()得到工作表的行数
			for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
				//得到Excel工作表的行   
				Row row = st.getRow(rowIndex);
				//如果读取到某一行无值，返回循环读取下一行
				if (row == null) {
					continue;
				}
				//得到指定行的列数
				int tempRowSize = row.getLastCellNum() + 1;
				//循环每一行中，当本次的列数大于前一行的列数则修改rowSize
				if (tempRowSize > rowSize) {
					rowSize = tempRowSize;
				}
				//每循环一列就新建一个values数组，将每一行的不同列按顺序存入数组，
				//当某一行的列数遍历完成，就将数组存入集合，又重新建一个values数组，遍历下一行的每一列
				String[] values = new String[rowSize];
				Arrays.fill(values, "");
				boolean hasValue = false;
				for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
					String value = "";
					//得到Excel工作表指定行的单元格 
					cell = row.getCell(columnIndex);
					if (cell != null) {
						// 注意：一定要设成这个，否则可能会出现乱码
						//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
						//判断类型
						switch (cell.getCellType()) {
							case HSSFCell.CELL_TYPE_STRING:
								value = cell.getStringCellValue();
								break;
							case HSSFCell.CELL_TYPE_NUMERIC:
								if (HSSFDateUtil.isCellDateFormatted(cell)) {
									Date date = cell.getDateCellValue();
									if (date != null) {
										value = new SimpleDateFormat("yyyy-MM-dd").format(date);
									} else {
										value = "";
									}
								} else {
									value = new DecimalFormat("0").format(cell.getNumericCellValue());
								}
								break;
							case HSSFCell.CELL_TYPE_FORMULA:
								// 导入时如果为公式生成的数据则无值
								if (!cell.getStringCellValue().equals("")) {
									value = cell.getStringCellValue();
								} else {
									value = cell.getNumericCellValue() + "";
								}
								 break;
							case HSSFCell.CELL_TYPE_BLANK:
								 break;
							case HSSFCell.CELL_TYPE_ERROR:
								 value = "";
								 break;
							case HSSFCell.CELL_TYPE_BOOLEAN:
								 value = (cell.getBooleanCellValue() == true ? "Y": "N");
								 break;
							default:
								value = "";
						}
					}
					//如果某一行的第一列没有值，则不再循环这一行的每一列
					if (columnIndex == 0 && value.trim().equals("")) {
						break;
					}
					value.replace(",","，");
					values[columnIndex] = rightTrim(value);
					hasValue = true;
				}
				if (hasValue) {
					result.add(values);
				}
			}
		}
		fis.close();
		in.close();
		String[][] returnArray = new String[result.size()][rowSize];
		for (int i = 0; i < returnArray.length; i++) {
			returnArray[i] = (String[]) result.get(i);
		}
		return returnArray;
	}

	/**
	 * 去掉字符串右边的空格
	 * 
	 * @param str
	 *            要处理的字符串
	 * @return 处理后的字符串
	 */
	public static String rightTrim(String str) {
		if (str == null) {
			return "";
		}
		int length = str.length();
		for (int i = length - 1; i >= 0; i--) {
			//charAt(i)获得字符串的第i个字符；
			//ASCII码 0x20 表示空格
			if (str.charAt(i) != 0x20) {
				break;
			}
			length--;
		}
		return str.substring(0, length);
	}
}
